// Copyright (C) 2023 即时通讯网(52im.net) & Jack Jiang.
// The RainbowChat Project. All rights reserved.
// 
// 【本产品为著作权产品，合法授权后请放心使用，禁止外传！】
// 【本次授权给：<北京小羊驼科技有限公司>，授权编号：<NT231212144350>，代码指纹：<A.702363430.550>，技术对接人微信：<ID: wxid_wbyootvkdcgj22>】
// 【授权寄送：<收件：苏先生、地址：北京市大兴区北京密码西区6号楼1单元301、电话：18613885610、邮箱：bd@huiyuanxiang-inc.com>】
// 
// 【本系列产品在国家版权局的著作权登记信息如下】：
// 1）国家版权局登记名(简称)和权证号：RainbowChat    （证书号：软著登字第1220494号、登记号：2016SR041877）
// 2）国家版权局登记名(简称)和权证号：RainbowChat-Web（证书号：软著登字第3743440号、登记号：2019SR0322683）
// 3）国家版权局登记名(简称)和权证号：RainbowAV      （证书号：软著登字第2262004号、登记号：2017SR676720）
// 4）国家版权局登记名(简称)和权证号：MobileIMSDK-Web（证书号：软著登字第2262073号、登记号：2017SR676789）
// 5）国家版权局登记名(简称)和权证号：MobileIMSDK    （证书号：软著登字第1220581号、登记号：2016SR041964）
// * 著作权所有人：江顺/苏州网际时代信息科技有限公司
// 
// 【违法或违规使用投诉和举报方式】：
// 联系邮件：jack.jiang@52im.net
// 联系微信：hellojackjiang
// 联系QQ号：413980957
// 授权说明：http://www.52im.net/thread-1115-1-1.html
// 官方社区：http://www.52im.net
package com.x52im.rbchat.network.http.async;

import android.app.Activity;
import android.content.Intent;

import com.eva.android.widget.DataLoadingAsyncTask2;
import com.eva.android.widget.WidgetUtils;
import com.eva.android.widget.alert.AlertDialog;
import com.eva.framework.dto.DataFromServer;
import com.x52im.rbchat.MyApplication;
import com.x52im.rbchat.R;
import com.x52im.rbchat.cache.AlarmsProvider;
import com.x52im.rbchat.cache.FriendsListProvider;
import com.x52im.rbchat.logic.alarm.AlarmType;
import com.x52im.rbchat.logic.more.MyFragment;
import com.x52im.rbchat.logic.more.UserActivity;
import com.x52im.rbchat.network.http.HttpRestHelper;
import com.x52im.rainbowchat.http.logic.dto.RosterElementEntity;
import com.x52im.rbchat.utils.IntentFactory;

import net.x52im.mobileimsdk.android.ClientCoreSDK;

/**
 * 查询指定用户的个人信息.
 * <b>注意：</b>本类当前主要用于实现“查找好友”功能界面中的精确查找（
 * 即只精确查找一个好友的个人信息）等场景下.
 * 
 * <p>
 * 使用异步线程实现，提升用户体验.
 * 
 * <p><b>重要说明：</b>本类中excute(..)方法执行时，需要传入3个参数，参
 * 见useMail、mailOfFriend、uidOfFriend.
 *
 * @author JackJiang
 * @since 3.0
 */
public class QueryFriendInfo extends DataLoadingAsyncTask2<Object, Integer, DataFromServer> {

	// true表示用好友的mail地址添加好友，否则表示用好友的uid
	private boolean useMail = false;
	// 好友的mail地址（当useMail==false时，本参数无意义）
	private String mailOfFriend = null;
	// 好友的uid（当useMail==true时，本参数无意义）
	private String uidOfFriend = null;

	public QueryFriendInfo(Activity context) {
		super(context, context.getString(R.string.general_loading));
	}

	/**
	 * 在后台执行查询.
	 * 
	 * @param parems 外界传进来的参数
	 * @return 查询结果，将传递给onPostExecute(..)方法
	 */
	@Override
	protected DataFromServer doInBackground(Object... parems) {
		useMail = (Boolean)parems[0];
		// 当useMail==false时，本参数无意义
		mailOfFriend = (String)parems[1];
		// 当useMail==true时，本参数无意义
		uidOfFriend = (String)parems[2];

		return HttpRestHelper.submitGetFriendInfoToServer(useMail, mailOfFriend, uidOfFriend);
	}

	//* 到了本方法里即意味着与服务端的交互成功了
	@Override
	protected void onPostExecuteImpl(Object jsonOfResult) {
		RosterElementEntity friendInfo = null;
		
		//服务端返回的用户信息不为空，即证明该用户存在，否则表示不存在该用户
		if(jsonOfResult != null 
			&& (friendInfo = HttpRestHelper.parseGetFriendInfoFromServer((String)jsonOfResult)) != null) {
			// 将取到的最新好友信息先更新到好友列表数据模型中，尽可能确保内存数据是最新的 - @since 7.3
			FriendsListProvider flp = MyApplication.getInstance2().getIMClientManager().getFriendsListProvider();
			// 如果对方是我的好友，则更新本地好友列表缓存信息
			if(flp != null && flp.isUserInRoster2(friendInfo.getUser_uid())) {
				flp.putFriend(friendInfo);
			}
			// 如果对方是陌生人，则更新它所在的首页"消息"列表中的聊天信息内容，确保能在不重启app的情况下及时趁机刷新显示该人的最新相关信息
			else{
				AlarmsProvider ap = MyApplication.getInstance2().getIMClientManager().getAlarmsProvider();
				if(ap != null){
					// 更新它所在的首页"消息"列表中的聊天信息内容
					ap.updateAlarmTitleAndExtra1(AlarmType.guestChat, friendInfo.getUser_uid(), friendInfo.getNickname(), friendInfo.getUserAvatarFileName(), true);
				}
			}

			if(context != null)
				// 转到好友信息查看界面
				context.startActivity(IntentFactory.createFriendInfoIntent(context, friendInfo));
		} else {
			if(context != null) {
				// 该邮件的好友不存在
				if (useMail) {
					new AlertDialog.Builder(context)
							.setTitle(R.string.sns_find_firend_form_mail_not_exist)
							.setMessage(R.string.sns_find_firend_form_mail_not_exist_tip)
							// 进入邀请注册页面
							.setPositiveButton(R.string.sns_find_firend_form_invite_uid, (dialog, which) -> ((Activity) context).startActivity(IntentFactory.createInviteFriendIntent((Activity) context, mailOfFriend)))
							.setNegativeButton(R.string.general_back, null)
							.show();
				} else {
					new AlertDialog.Builder(context)
							.setTitle(R.string.general_tip)
							.setMessage(R.string.sns_find_firend_form_uid_not_exist_tip)
							.setNegativeButton(R.string.general_ok, null)
							.show();
				}
			}
		}
	}

	/**
	 * 查看用户资料（方法内部将根据有网、无网等情况智能判断并进行相应的信息加载逻辑，确保最大限度查看的是最新数据）。
	 *
	 * @param context 上下文
	 * @param uid 用户uid
	 * @param userInfo 用户信息数据，如果此数据不为空，将优先查看此数据
	 */
	public static void gotoWatchUserInfo(Activity context, String uid, RosterElementEntity userInfo){

		// 如是本地用户，则直接跳转到本地用户的"个人中心"界面
		if(MyApplication.getInstance2().getIMClientManager().isLocalUser(uid)){
			Intent intent = new Intent(context, UserActivity.class);
			context.startActivityForResult(intent, MyFragment.REQUEST_CODE_FOR_GO_TO_USER$ACTIVITY);
			return;
		}

		// 如果userInfo内容不为空，由直接查看
		if(userInfo != null){
			// 直接转到信息查看界面
			context.startActivity(IntentFactory.createFriendInfoIntent(context, userInfo));
			return;
		}

		// 有网络的情况下，优先从网络加载最新数据
		if(ClientCoreSDK.getInstance().isConnectedToServer()){
			new QueryFriendInfo(context).execute(false, null, uid);
			return;
		}
		// 否则，就读取好友的缓存数据
		else{
			FriendsListProvider flp = MyApplication.getInstance2().getIMClientManager().getFriendsListProvider();
			if(flp.isUserInRoster2(uid)) {
				RosterElementEntity friendInfo = flp.getFriendInfoByUid2(uid);
				if(friendInfo != null) {
					// 转到好友信息查看界面
					context.startActivity(IntentFactory.createFriendInfoIntent(context, friendInfo));
					return;
				}
			}
		}

		WidgetUtils.showToastLong(context, context.getResources().getString(R.string.chat_message_send_error), WidgetUtils.ToastType.WARN);
	}
}